package com.inspur.edp.metadata.rtcustomization.servermanager.utils;

import io.iec.edp.caf.commons.runtime.CafEnvironment;
import io.iec.edp.caf.commons.transaction.JpaTransaction;

/**
 * 元数据文件化存储工具类
 *
 * @author liangff
 * @since 0.1.0
 * 2025/1/9
 */
public class MetadataStorageUtils {

    // 是否使用第二数据源，主要用在主服务内。为true，说明主服务使用H2内存数据库。
    private static Boolean usingSecondDatasource;

    // 是否使用文件化存储，主要用在元数据部署工具内。元数据部署工具内设置为true，则使用文件化存储。
    private static boolean usingFileHashStorage;

    // 默认存储目录
    public static final String INBUILDER_STORAGE_DIRECTORY = "inbuilder";

    public static boolean isUsingSecondDatasource() {
        if (usingSecondDatasource == null) {
            usingSecondDatasource = CafEnvironment.enableFileHashStorage();
        }
        return usingSecondDatasource;
    }

    // 是否使用文件化存储。主服务内使用第二数据源，元数据部署工具内usingFileHashStorage设置为true，说明启用文件化存储。
    public static boolean isUsingFileHashStorage() {
        return usingFileHashStorage || isUsingSecondDatasource();
    }

    // 用在元数据部署工具启用时，设置为true，在元数据部署工具内启用文件化存储。
    public static void setUsingFileHashStorage(boolean usingFileHashStorage) {
        MetadataStorageUtils.usingFileHashStorage = usingFileHashStorage;
    }

    /**
     * 获取事务管理器
     * 未开启文件化时，使用默认事务管理器
     * 开启文件化时，使用内存事务管理器
     * 支持打印格式，当前在运行时生成元数据的保存、删除时，使用这个方法
     *
     * @return 事务管理器
     */
    public static JpaTransaction getTransaction() {
        return isUsingSecondDatasource() ? JpaTransaction.getTransaction("MemoryTransactionManager") : JpaTransaction.getTransaction();
    }
}
